//package com.x9space.framework.config;
//
//import java.io.IOException;
//import java.util.*;
//import javax.sql.DataSource;
//import org.apache.ibatis.io.VFS;
//import org.apache.ibatis.session.SqlSessionFactory;
//import org.mybatis.spring.SqlSessionFactoryBean;
//import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.env.Environment;
//import org.springframework.core.io.DefaultResourceLoader;
//import org.springframework.core.io.Resource;
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
//import org.springframework.core.io.support.ResourcePatternResolver;
//import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
//import org.springframework.core.type.classreading.MetadataReader;
//import org.springframework.core.type.classreading.MetadataReaderFactory;
//import org.springframework.util.ClassUtils;
//import com.x9space.common.utils.StringUtils;
//
///**
// * Mybatis支持*匹配扫描包
// *
// * @author x9space
// */
//@Configuration
//public class MyBatisConfig
//{
//
//    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
//
//
//
//    public Resource[] resolveMapperLocations(String[] mapperLocations)
//    {
//        if (mapperLocations == null) return new Resource[0];
//        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
//        List<Resource> resources = new ArrayList<Resource>();
//        if (mapperLocations != null)
//        {
//            for (String mapperLocation : mapperLocations)
//            {
//                try
//                {
//                    Resource[] mappers = resourceResolver.getResources(mapperLocation);
//                    resources.addAll(Arrays.asList(mappers));
//                }
//                catch (IOException e)
//                {
//                    // ignore
//                }
//            }
//        }
//        return resources.toArray(new Resource[0]);
//    }
//
//
//
////    public SqlSessionFactory createSqlSessionFactory(Environment env, DataSource dataSource) throws Exception
////    {
////        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
////        String mapperLocations = env.getProperty("mybatis.mapperLocations");
////        String configLocation = env.getProperty("mybatis.configLocation");
////        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
////        VFS.addImplClass(SpringBootVFS.class);
////
////        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
////        sessionFactory.setDataSource(dataSource);
////        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
////        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
////        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
////        return sessionFactory.getObject();
////    }
////
////
////    @Bean(name = "sqlSessionFactoryMaster")
////    public SqlSessionFactory sqlSessionFactoryMaster(Environment env, @Qualifier("masterDataSource") DataSource dataSource) throws Exception
////    {
////        return createSqlSessionFactory(env, dataSource);
////    }
////    @Bean(name = "sqlSessionFactorySlave")
////    public SqlSessionFactory sqlSessionFactorySlave(Environment env, @Qualifier("slaveDataSource") DataSource dataSource) throws Exception
////    {
////        return createSqlSessionFactory(env, dataSource);
////    }
////
////    @Bean(name = "sqlSessionTemplate")
////    public DynamicSqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactoryMaster") SqlSessionFactory factoryMaster,
////                                                        @Qualifier("sqlSessionFactorySlave") SqlSessionFactory factorySlave) throws Exception
////    {
////        Map<Object, SqlSessionFactory> sqlSessionFactoryMap = new HashMap<>();
////        sqlSessionFactoryMap.put(DruidConfig.MASTER, factoryMaster);
////        sqlSessionFactoryMap.put(DruidConfig.SLAVE, factorySlave);
////
////        DynamicSqlSessionTemplate customSqlSessionTemplate = new DynamicSqlSessionTemplate(factoryMaster);
////        customSqlSessionTemplate.setTargetSqlSessionFactorys(sqlSessionFactoryMap);
////        return customSqlSessionTemplate;
////    }
//
//    @Bean
//    public SqlSessionFactory sqlSessionFactory(Environment env,DataSource dataSource) throws Exception
//    {
//        // 单个数据源 不能使用其他的名字作为SqlSessionFactory的名字，否则事务不成功，只能使用sqlSessionFactory作为其名字
////        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
//        String mapperLocations = env.getProperty("mybatis.mapperLocations");
//        String configLocation = env.getProperty("mybatis.configLocation");
////        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
//        VFS.addImplClass(SpringBootVFS.class);
//        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
//        sessionFactory.setDataSource(dataSource);
////        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
//        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
//        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
//        return sessionFactory.getObject();
//    }
//
////    public static String setTypeAliasesPackage(String typeAliasesPackage)
////    {
////        if (StringUtils.isEmpty(typeAliasesPackage)){
////            return "";
////        }
////        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
////        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
////        List<String> allResult = new ArrayList<String>();
////        try
////        {
////            for (String aliasesPackage : typeAliasesPackage.split(","))
////            {
////                List<String> result = new ArrayList<String>();
////                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
////                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
////                Resource[] resources = resolver.getResources(aliasesPackage);
////                if (resources != null && resources.length > 0)
////                {
////                    MetadataReader metadataReader = null;
////                    for (Resource resource : resources)
////                    {
////                        if (resource.isReadable())
////                        {
////                            metadataReader = metadataReaderFactory.getMetadataReader(resource);
////                            try
////                            {
////                                result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
////                            }
////                            catch (ClassNotFoundException e)
////                            {
////                                e.printStackTrace();
////                            }
////                        }
////                    }
////                }
////                if (result.size() > 0)
////                {
////                    HashSet<String> hashResult = new HashSet<String>(result);
////                    allResult.addAll(hashResult);
////                }
////            }
////            if (allResult.size() > 0)
////            {
////                typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
////            }
////            else
////            {
////                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
////            }
////        }
////        catch (IOException e)
////        {
////            e.printStackTrace();
////        }
////        return typeAliasesPackage;
////    }
//
//}
